Windows Installer всегда устанавливает и удаляет приложение как единый участок информации, называемый компонентом. Компонент может состоять из набора файлов, параметров реестра, ярлыков или любой другой информации, которая должна записываться на компьютер пользователя в процессе установки. Программа установки идентифицирует компонент с помощью его уникального кода GUID. Местоположение компонента определяется с помощью файла ключевого пути, принадлежащего этому компоненту. Поскольку обычно компоненты используются совместно несколькими приложениями или продуктами, разработчики должны корректно организовывать разбивку приложения на компоненты, чтобы обеспечить управляемость приложения программой установки. Более подробную информацию можно найти в разделе «Organizing Applications into Components (Компонентная организация приложений)» в документации по Windows Installer в Platform SDK.
Чтобы гарантировать, что удаление одной программы не нарушит работу других программ в системе и что Windows Installer корректно удалит все ресурсы, относящиеся к данной программе, Ваше приложение должно строго придерживаться следующих правил:
Одиночный ресурс не должен поставляться в качестве элемента набора компонентов в нескольких продуктах, если он не выделен как независимый компонент и не отмечен в таблице компонентов как совместно используемый.
Все файлы одного компонента должны устанавливаться в один и тот же каталог. Это означает, что файлы в различных каталогах должны принадлежать различным компонентам.
Все файлы, используемые ярлыками с объявлением, должны представлять собой ключевой путь компонента. Это означает, что в одном компоненте может быть только один файл с объявлением, хотя указывать на этот файл могут несколько ярлыков.
Серверы COM должны быть ключевым путем компонента. Это означает, что на один компонент может быть только один сервер COM. Отдельный файл, находящийся только в одном компоненте, может обслуживать несколько CLSID. Однако два файла, обслуживающие различные CLSID, должны находиться в различных компонентах.
Серверы расширения должны быть ключевым путем компонента. Это означает, что на один компонент может приходиться только один сервер расширения.